package com.lagou.edu.utils;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author 应癫
 */


public class LogUtils {

    /**
     * 业务逻辑开始之前执行
     */
    public void beforeMethod(JoinPoint joinPoint) {
        System.out.println("业务逻辑开始执行之前打印参数");
        Object[] args = joinPoint.getArgs();
        for (int i = 0; i < args.length; i++) {
            Object arg = args[i];
            System.out.println(arg);
        }
        System.out.println("业务逻辑开始执行之前执行.......\n");
    }


    /**
     * 业务逻辑结束时执行（无论异常与否）
     */
    public void afterMethod() {
        System.out.println("业务逻辑结束时执行，无论异常与否都执行.......");
    }


    /**
     * 异常时时执行
     */
    public void exceptionMethod() {
        System.out.println("异常时执行.......");
    }


    /**
     * 业务逻辑正常时执行
     */
    public void successMethod() {
        System.out.println("业务逻辑正常时执行.......");
    }


    /**
     * 环绕通知
     *
     */
    public Object arroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕通知中的beforemethod....");

        Object result = null;
        try{
            // 控制原有业务逻辑是否执行
            // result = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
        }catch(Exception e) {
            System.out.println("环绕通知中的exceptionmethod....");
        }finally {
            System.out.println("环绕通知中的after method....");
        }

        return result;
    }

}

//@Component
//@Aspect
//public class LogUtils {
//
//
//    @Pointcut("execution(* com.lagou.edu.service.impl.TransferServiceImpl.*(..))")
//    public void pt1(){
//
//    }
//
//
//    /**
//     * 业务逻辑开始之前执行
//     */
//    @Before("pt1()")
//    public void beforeMethod(JoinPoint joinPoint) {
//        Object[] args = joinPoint.getArgs();
//        for (int i = 0; i < args.length; i++) {
//            Object arg = args[i];
//            System.out.println(arg);
//        }
//        System.out.println("业务逻辑开始执行之前执行.......");
//    }
//
//
//    /**
//     * 业务逻辑结束时执行（无论异常与否）
//     */
//    @After("pt1()")
//    public void afterMethod() {
//        System.out.println("业务逻辑结束时执行，无论异常与否都执行.......");
//    }
//
//
//    /**
//     * 异常时时执行
//     */
//    @AfterThrowing("pt1()")
//    public void exceptionMethod() {
//        System.out.println("异常时执行.......");
//    }
//
//
//    /**
//     * 业务逻辑正常时执行
//     */
//    @AfterReturning(value = "pt1()",returning = "retVal")
//    public void successMethod(Object retVal) {
//        System.out.println("业务逻辑正常时执行.......");
//    }
//
//
//    /**
//     * 环绕通知
//     *
//     */
//    /*@Around("pt1()")*/
//    public Object arroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//        System.out.println("环绕通知中的beforemethod....");
//
//        Object result = null;
//        try{
//            // 控制原有业务逻辑是否执行
//            // result = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
//        }catch(Exception e) {
//            System.out.println("环绕通知中的exceptionmethod....");
//        }finally {
//            System.out.println("环绕通知中的after method....");
//        }
//
//        return result;
//    }
//
//}
